//
//  MapAlgorithm.h
//  SPMapKit
//
//  Created by zhangbo on 2017/9/7.
//  Copyright © 2017年 zhangbo. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>

#define EarthRadius 6378137
#define MinLatitude -85.05112878
#define MaxLatitude 85.05112878
#define MinLongitude -180
#define MaxLongitude 180
#define kDefaultTileSize  256

typedef NS_ENUM(NSUInteger, SPMapType) {
    SPMapTypeStandard = 0,
    SPMapTypeSatellite,
    SPMapTypeHybrid,
    SPMapTypeBlank
};

double Clip(double n,double minValue, double maxValue);
uint MapSize(int levelOfDetail);
double GroundResolution(double latitude, int levelOfDetail);
double MapScale(double latitude, int levelOfDetail, int screenDpi);
void LatLongToPixelXY(double latitude, double longitude, int levelOfDetail, double* pixelX, double* pixelY);
void PixelXYToLatLong(double pixelX, double pixelY, int levelOfDetail, double* latitude, double* longitude);
void PixelXYToTileXY(int pixelX, int pixelY, int* tileX, int* tileY);
void TileXYToPixelXY(int tileX, int tileY, int* pixelX, int* pixelY);
void QuadKeyToTileXY(char* quadKey, int* tileX, int* tileY, int* levelOfDetail);

bool outOfChina(double lat, double lon);
double transformLat(double x, double y);
double transformLon(double x, double y);
void convertGPS84_To_Gcj02(double x, double y, double* transX, double* transY);
void convertGcj02_To_GPS84(double x, double y, double* transX, double* transY);
double pointToSegDist(double x, double y, double x1, double y1, double x2, double y2);

@interface Tile : NSObject

@property(nonatomic, assign) int row;
@property(nonatomic, assign) int col;

@end

@protocol MapTileProviderProtocol <NSObject>

/**
 瓦片图片的url

 @param row 行
 @param col 列
 @param level 地图级数
 @return 地址url
 */
-(NSString*) tileImageUrl:(NSInteger) row  col:(NSInteger) col level:(NSInteger) level mapType:(SPMapType) mapType;

/**
 gps坐标转换为滚动视图中的偏移

 @param gpspoint gps坐标
 @param level 地图级数
 @return 偏移量
 */
-(CGPoint) GPSToContentOffset:(CLLocationCoordinate2D) gpspoint level:(NSInteger) level mapType:(SPMapType) mapType;;

/**
 滚动视图中的偏移转为gps坐标

 @param offset 偏移量
 @param level 地图级数
 @return gps坐标
 */
-(CLLocationCoordinate2D) ContentOffsetToGPS:(CGPoint) offset level:(NSInteger) level mapType:(SPMapType) mapType;

/**
 gps坐标所在的瓦片在滚动视图中的偏移

 @param gpspoint gps坐标
 @param level 地图级数
 @return 偏移量
 */
-(CGPoint) GPSToTileOffset:(CLLocationCoordinate2D) gpspoint level:(NSInteger) level mapType:(SPMapType) mapType;;

/**
 地面分辨率，指一个像素代表的地面距离

 @param lat 维度
 @param level 地图级数
 @return 地面分辨率
 */
-(CGFloat) GroundResolution:(CGFloat) lat level:(int) level;

@end

//@interface MapAlgorithm : NSObject
//
//@end
